﻿CREATE PROCEDURE [dbo].[RepriceDocUpdate]
(--переоценка товара
	@DocDate smalldatetime,
	@DocNumber varchar(20),
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50),
	@Original_Id int,
	@Original_MD datetime
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int
DECLARE @orgDocDate smalldatetime, @orgDocTypeId int, @datOperDate datetime

SET NOCOUNT ON

IF (@DocDate Is Null) OR (@DocNumber Is Null) OR (@Original_Id Is Null) OR (@Original_MD Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @orgDocTypeId = DocTypeId, @orgDocDate = DocDate
FROM CA.Documents WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgDocTypeId <> 10
BEGIN
	SELECT @intErrCode = 3, 
	@strMsg = 'Неправильный тип документа!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SET @DocDate = dbo.NormalizeDate(@DocDate)

IF @orgDocDate > @DocDate  --новая дата меньше старой
BEGIN --проверить чтобы даты Операций были не больше даты переоценки
--дата последней операции по переоцениваемой серии
	SELECT @datOperDate = MAX(D.DocDate)
	FROM CA.GoodsDocLines AS LS INNER JOIN
	CA.GoodsDocLines AS LD ON LS.PartyId = LD.PartyId INNER JOIN
	CA.Documents AS D ON LD.DocId = D.Id
	WHERE (LS.DocId = @Original_Id) AND (LS.Qntty < 0) AND (LD.DocId <> @Original_Id)

	IF @datOperDate >= dateadd(d,1,@DocDate)
	BEGIN
		SELECT @intErrCode = 4,
		@strMsg = 'Дата последней операции по переоцениваемой серии больше новой даты переоценки!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END

IF @orgDocDate > @DocDate  --новая дата больше старой
BEGIN --проверить чтобы даты первой Операций были не меньше даты переоценки
--дата первой операции по переоценённой серии
	SELECT @datOperDate = MIN(D.DocDate)
	FROM CA.GoodsDocLines AS LS INNER JOIN
	CA.GoodsDocLines AS LD ON LS.PartyId = LD.PartyId INNER JOIN
	CA.Documents AS D ON LD.DocId = D.Id
	WHERE (LS.DocId = @Original_Id) AND (LS.Qntty > 0) AND (LD.DocId <> @Original_Id)

	IF @datOperDate < @DocDate
	BEGIN
		SELECT @intErrCode = 5,
		@strMsg = 'Дата первой операции по переоценённой серии меньше новой даты переоценки!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
END

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT

	SET NOCOUNT OFF;
UPDATE [CA].[Documents] SET 
[DocDate] = @DocDate, 
[DocNumber] = @DocNumber, 
[Note] = @Note, [MD] = @MD, [MW] = @MW 
WHERE Id = @Original_Id AND MD = @Original_MD;
	
SELECT Id, DepartmentId, DocTypeId, DocDate, DocNumber, 
ContragentId, CashRegisterShiftId, DepartmentUserId, 
Note, MD, MW FROM CA.Documents WHERE (Id = @Original_Id)

RETURN 0